// 实现一个栈
// 实现一个栈 带有pop 出栈 push 入栈  getMin 方法 O(1)
// O(n) O(1)  空间换时间 i 
// push 谁是最小值 i 指针 最小值
// 缺点
// 1. 栈 熟悉 [] push pop 连续
// 2. ADT getMin 这个方法的
// 3. 指针变量 i 最小值 出栈的话 i 
// 空间换时间 双栈 O（1）
// 用栈来实现队列
var minStack = function() {
    this.stack = []; // 栈
    this.minStack = [] // 辅助栈 入栈的最小值 最小值在最上面 先进后出
}
// 把常考算法作为手写题来处理
minStack.prototype.push = function(x) {
    if(!this.minStack.length && x < this.minStack()) {
        this.minStack(x);
    }
    this.stack.push(x);
}
minStack.prototype.pop = function() {
    let x = this.stack.pop();
    if(x == this.getMin()) {
        this.minStack.pop();
    }
}

minStack.prototype.getMin = function() {
    if(!this.minStack.length) {
        throw new Error('stack is empty')
    }
    return this.minStack[this.minStack.length-1] //    O(1)
}


